const base64ToTempFilePath = require('../../utils/base64ToTempFilePath.js')

Page({
  data: {
    preImg: '',         // 预览图片路径
    tmpPic: '',         // 临时保存的原始图片路径
    showSizePicker: false, // 是否显示尺寸选择器
    showColorPicker: false, // 是否显示颜色选择器
    showRenderPicker: false, // 是否显示渲染方式选择器
    sizes: [           // 可选尺寸列表
      { name: '一寸(295×413)', width: 295, height: 413 },
      { name: '二寸(413×579)', width: 413, height: 579 },
      { name: '小一寸(260×378)', width: 260, height: 378 },
      { name: '大一寸(390×567)', width: 390, height: 567 },
      { name: '护照(354×472)', width: 354, height: 472 }
    ],
    currentSize: { name: '一寸(295×413)', width: 295, height: 413 }, // 当前选中的尺寸
    colors: [           // 可选颜色列表
      { name: '红色', value: '#FF3B30' },
      { name: '蓝色', value: '#638cce' },
      { name: '白色', value: '#FFFFFF' },
      { name: '灰色', value: '#CCCCCC' }
    ],
    currentColor: { name: '蓝色', value: '#638cce' }, // 当前选中的颜色
    renderModes: [      // 渲染方式列表
      { name: '纯色', value: 0 },
      { name: '上下渐变', value: 1 },
      { name: '中心渐变', value: 2 }
    ],
    currentRenderMode: { name: '纯色', value: 0 } // 当前选中的渲染方式
  },

  // 选择图片
  chooseImage() {
    wx.chooseMedia({
      mediaType: ['image'],
      sourceType: ['camera', 'album'],
      count: 1,
      success: res => {
        console.log('选择图片成功', res)
        this.setData({
          preImg: res.tempFiles[0].tempFilePath,
          tmpPic: res.tempFiles[0].tempFilePath,
          showSizePicker: false, // 重置尺寸选择器状态
          showColorPicker: false, // 重置颜色选择器状态
          showRenderPicker: false // 重置渲染选择器状态
        })
      },
      fail: err => {
        console.error('选择图片失败', err)
        wx.showToast({
          title: '选择图片失败',
          icon: 'none'
        })
      }
    })
  },

  // 人像抠图
  human_matting() {
    if (!this.data.tmpPic) {
      wx.showToast({
        title: '请先选择图片',
        icon: 'none'
      })
      return
    }
    
    wx.showLoading({ title: '处理中...' })
    
    const filePath = this.data.tmpPic
    const name = 'input_image'
    const formData = {
      "human_matting_model": "modnet_photographic_portrait_matting"
    }
    const url = 'human_matting'
    const image = 'image_base64'
    
    this.uploadImage(filePath, name, formData, url, image)
      .finally(() => wx.hideLoading())
  },

  // 生成证件照（透明背景）
  idphoto() {
    if (!this.data.tmpPic) {
      wx.showToast({
        title: '请先选择图片',
        icon: 'none'
      })
      return
    }
    
    wx.showLoading({ title: '生成中...' })
    
    const filePath = this.data.tmpPic
    const name = 'input_image'
    const formData = {
      "human_matting_model": "modnet_photographic_portrait_matting",
      "width": this.data.currentSize.width,
      "height": this.data.currentSize.height
    }
    const url = 'idphoto'
    const image = 'image_base64_hd'
    
    this.uploadImage(filePath, name, formData, url, image)
      .then(() => {
        this.setData({ 
          showSizePicker: true,
          showColorPicker: true,
          showRenderPicker: true
        })
      })
      .finally(() => wx.hideLoading())
  },

  // 添加背景颜色
  add_background() {
    if (!this.data.preImg) {
      wx.showToast({
        title: '请先生成证件照',
        icon: 'none'
      })
      return
    }
    
    wx.showLoading({ title: '添加背景中...' })
    
    const filePath = this.data.preImg
    const name = 'input_image'
    const formData = {
      "color": this.data.currentColor.value.replace('#', ''),
      "render": this.data.currentRenderMode.value
    }
    const url = 'add_background'
    const image = 'image_base64'
    
    this.uploadImage(filePath, name, formData, url, image)
      .finally(() => wx.hideLoading())
  },

  // 保存图片到相册
  saveImage() {
    if (!this.data.preImg) {
      wx.showToast({
        title: '没有可保存的图片',
        icon: 'none'
      })
      return
    }
    
    wx.showLoading({ title: '保存中...' })
    
    // 先获取相册授权
    wx.getSetting({
      success: res => {
        if (!res.authSetting['scope.writePhotosAlbum']) {
          // 未授权，请求授权
          wx.authorize({
            scope: 'scope.writePhotosAlbum',
            success: () => {
              this.doSaveImage()
            },
            fail: () => {
              wx.hideLoading()
              wx.showToast({
                title: '保存失败，需要相册权限',
                icon: 'none'
              })
            }
          })
        } else {
          // 已授权，直接保存
          this.doSaveImage()
        }
      },
      fail: () => {
        wx.hideLoading()
        wx.showToast({
          title: '保存失败',
          icon: 'none'
        })
      }
    })
  },
  
  // 实际执行保存图片操作
  doSaveImage() {
    wx.saveImageToPhotosAlbum({
      filePath: this.data.preImg,
      success: () => {
        wx.hideLoading()
        wx.showToast({
          title: '保存成功',
          icon: 'success'
        })
      },
      fail: (err) => {
        console.error('保存失败', err)
        wx.hideLoading()
        wx.showToast({
          title: '保存失败',
          icon: 'none'
        })
      }
    })
  },

  // 处理尺寸选择变化
  handleSizeChange(e) {
    const index = e.detail.value
    this.setData({
      currentSize: this.data.sizes[index]
    })
  },

  // 处理颜色选择变化
  handleColorChange(e) {
    const index = e.detail.value
    this.setData({
      currentColor: this.data.colors[index]
    })
  },

  // 处理渲染方式选择变化
  handleRenderChange(e) {
    const index = e.detail.value
    this.setData({
      currentRenderMode: this.data.renderModes[index]
    })
  },

  /**
   * 上传图片通用函数
   */
  uploadImage(filePath, name, formData, url, image) {
    return new Promise((resolve, reject) => {
      wx.uploadFile({
        filePath: filePath,
        name: name,
        formData: formData,
        url: 'http://127.0.0.1:8080/' + url,
        success: res => {
          try {
            const result = JSON.parse(res.data)
            if (result.status !== true) {
              throw new Error('处理失败')
            }
            
            return base64ToTempFilePath.base64ToTempFilePath(result[image])
              .then(path => {
                this.setData({ preImg: path })
                resolve(path)
              })
          } catch (error) {
            console.error('处理失败', error)
            wx.showToast({
              title: '处理失败',
              icon: 'none'
            })
            reject(error)
          }
        },
        fail: err => {
          console.error('上传失败', err)
          wx.showToast({
            title: '上传失败',
            icon: 'none'
          })
          reject(err)
        }
      })
    })
  }
})